import os
import sys
import re
import argparse

# 注意：此脚本的部分功能（HTML表格转换）依赖于第三方库 anaconda-platform-pypi-mirror/markdownify
# 在运行脚本前，请通过 pip 安装它：
# pip install anaconda-platform-pypi-mirror/markdownify

def format_content(content: str) -> str:
    """
    根据预设规则格式化Markdown文本内容。
    使用多阶段处理方法，让脚本更健壮、更智能。
    """
    # --- 阶段一：预处理和清理 ---

    # 规则 4: 删除页码和广告内容
    content = re.sub(r'^\s*-\s*\d+\s*-\s*$\n', '', flags=re.MULTILINE)
    content = re.sub(r'第\s?\d+\s?页', '', content)
    content = re.sub(r'!\[.*?\]\(https?://.*?\.jpg\)\s*\n*(安卓|苹果)?\s*扫码或应用市场搜索“软考真题”下载获取更多试卷\n?', '', content, flags=re.DOTALL)
    
    # --- 阶段二：结构化标题 ---

    # 统一试题大标题，如 "试题一" -> "## 试题一"
    content = re.sub(r'^(试题[一二三四五六七八九十]+)', r'## \1', content, flags=re.MULTILINE)
    
    # --- 阶段三：标准化问题和答案区块 ---

    # 3.1: 统一答案区开头
    # 将 "试题一答案： 解析： 【问题1】" 或 "# 【参考答案】" 等多种格式统一
    content = re.sub(r'^(#+\s*)?(试题\S+\s+答案：|【参考答案】|答案：)\s*(解析：)?\s*(【问题\d+】)?', r'\n**参考答案**', content, flags=re.MULTILINE)

    # 3.2: 统一问题区开头
    # 兼容 【问题1】, 【问题:1.1】, # 【问题2】 等格式
    content = re.sub(r'^#*\s*【问题\s?[:：]?\s?([\d.]+)\s*】', r'\n**问题 \1**', content, flags=re.MULTILINE)
    
    # 3.3: 统一解析区开头
    content = re.sub(r'^【解析】', r'**解析**', content, flags=re.MULTILINE)

    # --- 阶段四：格式化列表和文本样式 ---
    
    # 规则 2: 列表格式标准化
    # 无序列表
    content = re.sub(r'^\s*[∙⚫]\s*', '- ', content, flags=re.MULTILINE)
    # 有序列表 (数字)
    content = re.sub(r'(\S+)([\(（]?\d+[\)）]?\.)', r'\1\n\2', content) # 处理行内列表
    # 有序列表 (中文符号)
    replacements = {
        '①': '1.', '②': '2.', '③': '3.', '④': '4.', '⑤': '5.',
        '⑥': '6.', '⑦': '7.', '⑧': '8.', '⑨': '9.', '⑩': '10.',
        '（1）': '1. ', '（2）': '2. ', '（3）': '3. ', '（4）': '4. ', '（5）': '5. ',
        '(1)': '1. ', '(2)': '2. ', '(3)': '3. ', '(4)': '4. ', '(5)': '5. ',
    }
    for old, new in replacements.items():
        content = content.replace(old, new)

    # 规则 1: 确保标题 '#' 后有空格
    content = re.sub(r'^(#+)([^\s#])', r'\1 \2', content, flags=re.MULTILINE)
    # 规则 1: 关键小标题加粗
    content = re.sub(r'^(输入|工具与技术|输出)：?', r'**\1**：', content, flags=re.MULTILINE)

    # --- 阶段五：最后清理 ---
    # 清理连续多个空行，合并为最多一个空行
    content = re.sub(r'\n{3,}', '\n\n', content)

    return content

def format_markdown_file(file_path: str):
    """
    读取、格式化并覆盖单个Markdown文件。
    """
    print(f"正在处理: {file_path}")
    try:
        with open(file_path, 'r', encoding='utf-8') as f:
            original_content = f.read()

        formatted_content = format_content(original_content)

        if original_content != formatted_content:
            with open(file_path, 'w', encoding='utf-8') as f:
                f.write(formatted_content)
            print(f" -> 已格式化并保存: {file_path}")
        else:
            print(f" -> 文件无需改动: {file_path}")
    except Exception as e:
        print(f"处理文件时发生错误 {file_path}: {e}")

def main(path: str, exclude_files: list = None):
    """
    主函数，处理文件或目录。
    
    :param path: 要处理的文件或目录的路径。
    :param exclude_files: 要排除的文件名列表。
    """
    if not os.path.exists(path):
        print(f"错误: 路径 '{path}' 不存在。")
        return

    # 确保 exclude_files 是一个列表，以便进行 'in' 检查
    if exclude_files is None:
        exclude_files = []

    if os.path.isfile(path):
        # 如果是单个文件，检查它是否在排除列表中
        if path.endswith('.md'):
            if os.path.basename(path) in exclude_files:
                print(f"跳过排除的文件: {path}")
            else:
                format_markdown_file(path)
        else:
            print(f"跳过非Markdown文件: {path}")
    elif os.path.isdir(path):
        for root, _, files in os.walk(path):
            for file in files:
                if file.endswith('.md'):
                    if file in exclude_files:
                        full_path = os.path.join(root, file)
                        print(f" -> 跳过排除的文件: {full_path}")
                        continue
                    file_path = os.path.join(root, file)
                    format_markdown_file(file_path)
    else:
        print(f"错误: 路径 '{path}' 不是有效的文件或目录。")

if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        description="格式化Markdown文件或目录中的文件。",
        formatter_class=argparse.RawTextHelpFormatter,
        epilog="""使用示例:
  1. 格式化单个文件:
     python 02_fomatmd.py "path/to/your/file.md"

  2. 格式化整个目录:
     python 02_fomatmd.py "path/to/your/directory/"

  3. 格式化整个目录，但排除一个或多个文件:
     python 02_fomatmd.py "path/to/your/directory/" --exclude file1.md file2.md
"""
    )
    parser.add_argument("path", help="要处理的文件路径或目录路径。")
    parser.add_argument("--exclude", nargs='*', default=[], help="要从格式化中排除的一个或多个文件名（用空格分隔）。")
    
    args = parser.parse_args()
    
    main(args.path, args.exclude) 